package ooap;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/7 20:01
 * 代码块
 *  直接用｛｝括起来的代码，称之为代码块
 *  在java中根据代码块出现的位置以及关键字不同，分为四种：
 *      1.普通代码块
 *          在方法中（成员/静态都可）直接使用 ｛｝
 *              普通代码块定义的局部变量，出了作用域｛｝就会被销毁
 *              解决方法中局部变量名称相同的情况
 *      2.构造快
 *          直接在类中，不加任何关键字，直接使用｛｝
 *              构造块优先于构造方法执行，
 *              每当产生该类对象时，就会调用一次构造块
 *          在编译后的class文件，会将说有的构造代码块和构造方法合并在一起，而且构造代码块会写在构造方法之上
 *
 *          无论是构造方法还是构造块，都是为了初始化对象
 *      3.静态块
 *          直接定义在类中，使用static修饰的代码块
 *
 *          在类加载时执行，和对象无关，无论有多个对象产生，都  只  会执行一次，优先于构造块（构造方法）
 *          在主类中的静态块，优先于主方法 执行
 *
 *          为了类中的静态变量的初始化，以及一些类加载信息（SpringIoc容器）
 *      4.同步代码块
 *          在定义方法中使用关键字sychronized修饰的代码块
 */
public class CodeBlock {
    int age;
    String name;

    public CodeBlock(int age, String name) {
        System.out.println("类中的构造方法");

        this.age = age;
        this.name = name;
    }

    //构造块  直接在类中，不加任何关键字，直接使用｛｝
    {
        System.out.println("类中的构造代码块 1 ");
        age= 10;
        name ="wei";
    }
    {
        System.out.println("类中的构造代码块 2 ");
        age= 10;
        name ="wei";
    }
    //主类中的静态块
    static{
        System.out.println("类中的静态块");
    }
    public static void main(String[] args) {
        //普通代码块   直接定义在方法中，使用｛｝
//        {
//            //普通代码块定义的局部变量，出了作用域｛｝就会被销毁
//            //解决方法中局部变量名称相同的情况
//            int a = 0b100;
//            System.out.println(a);
//        }
        System.out.println("main");
        CodeBlock c1 = new CodeBlock(18,"1");
//        System.out.println(c1);
//        CodeBlock c2 = new CodeBlock(28,"2");
//        System.out.println(c2);
//        CodeBlock c3 = new CodeBlock(28,"2");
//
//        StaticBlock s1 = new StaticBlock();
//        StaticBlock s2 = new StaticBlock();

    }
}
//静态代码块
class StaticBlock{
    public StaticBlock(){
        System.out.println("无参构造");
    }
    {
        System.out.println("构造快");
    }
    static {
        System.out.println("静态块");
    }
}